package com.geek.jdbc.batch;



import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @Desc TODO
 * @Author
 * @Date 2025/11/17
 *
 * Statement 批处理
 * SQL异构
 *
 * PreparedStatement 批处理
 * SQL同构，一个SQL语句批量传参，批处理
 * 1.JDBC的url连接中，追加参数 rewriteBatchedStatements=true ，设置允许批处理操作
 * 2.SQL同构，打包数据 ppst.addBatch();
 * 3.执行批处理DML操作 ppst.executeBatch();
 */
public class BatchDao {

    //未进行批处理
    @Test
    public void unBatch(){
        //1.获取连接对象
        Connection conn = com.geek.jdbc.batch.JDBCUtils.getConn();
        PreparedStatement ppst = null;
        //2.预编译SQL，获取语句对象
        try {
            long begin = System.currentTimeMillis();
            String sql = "insert into boy values(NULL,?)";
            ppst = conn.prepareStatement(sql);

            //3.给?占位符传值
            for (int i = 1; i <= 1000; i++) {
                ppst.setString(1 , "aaa"+i);
                //4.执行DML操作
                ppst.executeUpdate();
            }

            long end = System.currentTimeMillis();
            //未添加批处理耗时：1152ms
            System.out.println("未添加批处理耗时："+(end-begin)+"ms");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            //5.关闭资源
            com.geek.jdbc.batch.JDBCUtils.close(ppst , conn , null);
        }
    }


    //进行批处理
    @Test
    public void batch(){
        //1.获取连接对象
        Connection conn = com.geek.jdbc.batch.JDBCUtils.getConn();
        PreparedStatement ppst = null;
        //2.预编译SQL，获取语句对象
        try {
            long begin = System.currentTimeMillis();
            String sql = "insert into boy values(NULL,?)";
            ppst = conn.prepareStatement(sql);

            //3.给?占位符传值
            for (int i = 1; i <= 1000; i++) {
                ppst.setString(1 , "bbb"+i);
                //TODO 给数据打包
                ppst.addBatch();
            }

            //4.执行DML批处理操作
            ppst.executeBatch();
            long end = System.currentTimeMillis();
            //添加批处理耗时：1099ms
            System.out.println("添加批处理耗时："+(end-begin)+"ms");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            //5.关闭资源
            JDBCUtils.close(ppst , conn , null);
        }
    }

}
